package concurrent.volatile_test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 一个失败的使用volatile的案例
 */
public class FailExample {
    public volatile static int inc = 0;

    public void increase() {
        inc++;
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        FailExample volatoleAtomicityDemo = new FailExample();
        for (int i = 0; i < 5; i++) {
            threadPool.execute(() -> {
                for (int j = 0; j < 500; j++) {
                    volatoleAtomicityDemo.increase();
                }
            });
        }
        // 等待1.5秒，保证上面程序执行完成
        Thread.sleep(1500);
        System.out.println(inc);
        threadPool.shutdown();
        /*
        * 结果：每次输出结果都小于 2500
        * 原因：inc++不是原子性操作。它包含了3个步骤
        * 1.读取 inc 的值。
        * 2.对 inc 加 1。
        * 3.将 inc 的值写回内存
        * 改进方式；
        * 第一种：使用 synchronized 改进
        * 第二种：AtomicInteger
        * 第三种：ReentrantLock
         * */
    }

}
